package com.example.estemplate.controller;

import com.example.estemplate.dto.SpecifiedTemplatesDTO;
import com.example.estemplate.dto.TemplatesOperateResult;
import com.example.estemplate.service.TemplateManagerService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

/**
 * Elasticsearch模板管理控制器
 * 提供模板创建、更新、查询等RESTful接口
 */
@RestController
@RequestMapping("/api/templates")
@RequiredArgsConstructor
public class TemplateController {

    private final TemplateManagerService templateManagerService;

    /**
     * 多线程更新所有模板文件对应的索引模板到ES（带降级策略），
     * 使用多线程，比原来的老方法{@link TemplateController#syncAllTemplates()}性能更好。
     */
    @PostMapping("/concurrent-update-all")
    public ResponseEntity<TemplatesOperateResult> concurrentUpdateAllTemplates() {
        TemplatesOperateResult result = templateManagerService.concurrentUpdateAllTemplatesByFile();
        return ResponseEntity.ok(result);
    }

    /**
     * 多线程更新指定的索引模板到ES（带降级策略），
     * 使用多线程，比原来的老方法{@link TemplateController#syncSpecifiedTemplates(SpecifiedTemplatesDTO)}性能更好。
     *
     * @param dto 包含要更新的模板名称列表
     * @return 操作结果
     */
    @PostMapping("/concurrent-update-specified")
    public ResponseEntity<TemplatesOperateResult> concurrentUpdateSpecifiedTemplates(
            @RequestBody SpecifiedTemplatesDTO dto) {
        TemplatesOperateResult result = templateManagerService.concurrentUpdateTemplatesByFile(dto.getTemplateNames());
        return ResponseEntity.ok(result);
    }

    /**
     * 单线程同步所有模板文件对应的索引模板到ES
     *
     * @deprecated 已废弃，请使用{@link TemplateController#concurrentUpdateAllTemplates()} 方法，该方法使用多线程，性能更好。
     */
    @Deprecated
    @PostMapping("/sync-all")
    public ResponseEntity<TemplatesOperateResult> syncAllTemplates() {
        TemplatesOperateResult result = templateManagerService.syncAllTemplates();
        return ResponseEntity.ok(result);
    }


    /**
     * 单线程同步指定的模板到ES
     *
     * @deprecated 已废弃，请使用{@link TemplateController#concurrentUpdateSpecifiedTemplates(SpecifiedTemplatesDTO)} 方法，该方法使用多线程，性能更好。
     */
    @Deprecated
    @PostMapping("/sync-specified")
    public ResponseEntity<TemplatesOperateResult> syncSpecifiedTemplates(@RequestBody SpecifiedTemplatesDTO dto) {
        TemplatesOperateResult result = templateManagerService.sequentialUpdateTemplates(dto.getTemplateNames());
        return ResponseEntity.ok(result);
    }

    /**
     * 获取项目中“src/main/resources/es-templates”路径下的所有模板文件内容
     */
    @GetMapping("/file-contents")
    public ResponseEntity<Map<String, String>> getTemplateFileContents() {
        try {
            Map<String, String> templates = templateManagerService.loadAllTemplateFiles();
            return ResponseEntity.ok(templates);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取项目中“src/main/resources/es-templates”路径下的所有模板文件对应的模板名称
     */
    @GetMapping("/all-file-template-names")
    public ResponseEntity<List<String>> getAllFileTemplateNames() {
        try {
            List<String> allFileTemplateNames = templateManagerService.getAllFileTemplateNames();
            return ResponseEntity.ok(allFileTemplateNames);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取ES服务端上的所有模板名称
     */
    @GetMapping("/names-in-es")
    public ResponseEntity<List<String>> getTemplateNames() {
        try {
            List<String> templateNames = templateManagerService.getAllTemplateNamesInEs();
            return ResponseEntity.ok(templateNames);
        } catch (Exception e) {
            return ResponseEntity.internalServerError().build();
        }
    }
}